//
//  YMPluginSubType.swift
//  ChengLuMall
//
//  Created by 吳梓杭 on 2023/5/28.
//

import Foundation
import Moya

/// 继承Moya插件协议，方便后序扩展，所有插件方法都必须实现该协议
public protocol YMPluginSubType: Moya.PluginType {
    
    /// 插件名
    var pluginName: String { get }
    
    /// 设置网络配置信息之后，开始准备请求之前，
    /// 该方法可以用于本地缓存存在时直接抛出数据而不用再执行后序网络请求等场景
    /// - Parameters:
    ///   - tuple: 配置信息元组，其中包含数据源和是否结束后序网络请求
    ///   - target: 参数协议
    ///   - plugins: 配置的插件数组
    /// - Returns: 包涵数据源和是否结束后序网络请求的元组
    func configuration(_ tuple: ConfigurationTuple, target: TargetType, plugins: APIPlugins) -> ConfigurationTuple
    
    /// 最后的最后网络响应返回时刻，
    /// 该方法可以用于密钥失效重新去获取密钥然后自动再次网络请求等场景
    /// - Parameters:
    ///   - tuple: 自动再次元组，其中包含数据源和是否自动上次网络请求
    ///   - target: 参数协议
    ///   - onNext: 给插件异步处理任务，回调包含数据源和是否再次开启上次网络请求的元组
    func lastNever(_ tuple: LastNeverTuple, target: TargetType, onNext: LastNeverCallback)
}

public extension YMPluginSubType {
    
    func configuration(_ tuple: ConfigurationTuple, target: TargetType, plugins: APIPlugins) -> ConfigurationTuple {
        return tuple
    }
    
    func lastNever(_ tuple: LastNeverTuple, target: TargetType, onNext: LastNeverCallback) {
        onNext?(tuple)
    }
}
